Definicion

Ejemplos

Starting at 6 a.m., customers arrive at Martha’s bakery according to a Poisson process at the rate of 30 customers per hour. Find the probability that more than 65 customers arrive between 9 and 11 a.m.

1-ppois(65,2*30)
[1] 0.2355065

Joe receives text messages starting at 10 a.m. at the rate of 10 texts per hour according to a Poisson process. Find the probability that he will receive exactly 18 texts by noon and 70 texts by 5 p.m.

The desired probability is P(N2 = 18, N7 = 70), with time as hours. If 18 texts arrive in [0, 2] and 70 texts arrive in [0, 7], then there are 70 − 18 = 52 texts in (2, 7]. That is, {N2 = 18, N7 = 70} = {N2 = 18, N7 − N2 = 52}.

The intervals [0, 2] and (2, 7] are disjoint, which gives P(N2 = 18, N7 = 70) = P(N2 = 18, N7 − N2 = 52) = P(N2 = 18) P(N7 − N2 = 52) = P(N2 = 18) P(N5 = 52)

= (e−2(10)(2(10))** 18/18!) * (e−5(10)(5(10))** 52/52!)

where the second equality is because of independent increments, and the third equal- ity is because of stationary increments. The inal calculation in R is

base el el promedio por hora, x,y es la multiplicacion de el primer evento por la cantidad de tiempo transcurrida siendo m,n lo mismo pero para el siguiente evento

poisson_multiplicado <- function(x,y,m,n,base){
  resultado <- 0
    resultado <- dpois(x,y*base)*dpois(m,n*base)
    return(resultado)
}

resultado0 <- poisson_multiplicado(18,2,52,5,10)
print(resultado0)
[1] 0.004481021
Proceso de Poisson traducido

On election day, people arrive at a voting center according to a Pois- son process. On average, 100 voters arrive every hour. If 150 people arrive during the irst hour, what is the probability that at most 350 people arrive before the third hour?

Let Nt denote the number of arrivals in the irst t hours. Then, (Nt)t≥0 is a Poisson process with parameter lambda = 100. Given N1 = 150, the distribution of N3 − N1 = N3 − 150 is equal to the distribution of N2. This gives

P(N3 ≤ 350|N1 = 150) = P(N3 − 150 ≤ 200|N1 = 150) = P(N2 ≤ 200)

Esta formula se utliza cuando ocurre un resultado diferente de la media y se espera un resultado posterior en el tiempo dado x=promedio , y=numero_de_eventos, z=esperado_acciones

poisson_acumulada <- function (x,y,z){
    resultado <- 0
    for(i in 0:z){
      resultado = resultado + dpois(i,x*y)
    }
    return(resultado)
}

resultado <- poisson_acumulada(100,2,200)
print(resultado)

ARRIVAL, INTERARRIVAL TIMES

Bus Waiting Times

# buswaiting.R
trials <- 5000
amy <- numeric(trials)
zach <- numeric(trials)
for (i in 1:trials) {
  bus <- rexp(1,1/30)
  amy[i] <- bus
  while (bus < 10) { bus <- bus + rexp(1,1/30) }
  zach[i] <- bus-10 }
mean(amy)
[1] 29.89918
mean(zach)
[1] 29.93092
hist(amy,xlab="Amy",prob=T,ylab="",main="")

hist(zach,xlab="Zach",prob=T,ylab="",main="")

Una estación de metro de Boston da servicio a las líneas roja, verde y naranja. Los subterráneos de cada línea llegan a la estación de acuerdo con tres Poisson independientes. procesos. En promedio, hay un tren rojo cada 10 minutos, un tren verde cada 15 minutos y un tren naranja cada 20 minutos.

  1. Cuando llegue a la estación, ¿cuál es la probabilidad de que el primer metro que llega es por la linea verde? ii)¿Cuánto tiempo esperará, en promedio, antes de que llegue algún tren? iii)Ha estado esperando 20 minutos por un tren rojo y ha visto tres pasan los trenes naranjas. ¿Cuál es el tiempo adicional esperado que esperará tu metro?

  2. Sean XG, XR y XO, respectivamente, los tiempos de las primeras luces verde, roja y roja. subterráneos naranjas que llegan a la estación. El evento de que el primer subterráneo es verde es el evento de que XG es el mínimo de los tres aleatorios independientes variables La probabilidad deseada es:

P(min(XG, XR, XO) = XG) = (1∕15) / (1∕10 + 1∕15 + 1∕20) = 4/13 = 0.31.

datos <- c(10,15,20)
esperado <- 15
promedio <- 0
llegadas_esperadas <- function(datos,esperado){
  for( x in datos){
      promedio <-  promedio + (1/x) 
  }
  
  resultado <- (1/esperado)/promedio
  return(resultado)
}

resultado <- llegadas_esperadas(datos,esperado)
print(resultado)
[1] 0.3076923
promedio_llegadas <- function(datos){
  promedio <- 0 
  for( x in datos){
      promedio <-  promedio + (1/x) 
      print((1/x) )
  }
  return(promedio)
}

print(promedio_llegadas(datos))
[1] 0.1
[1] 0.06666667
[1] 0.05
[1] 0.2166667
tiempo_promedio <- function(datos){
  sim <- replicate(10000,min(rexp(1,1/10),rexp(1,1/15),rexp(1,1/20)))
  o <- mean(sim)
  return(o)
}

segundo <- tiempo_promedio(datos)
print(segundo)
[1] 4.68072

Su tiempo de espera es independiente de las llegadas naranjas. por falta de memoria de tiempos entre llegadas, el tiempo de espera adicional para la línea roja tiene el mismo distribución como el tiempo de espera original. Esperarás, en promedio, 10 más minutos.


Los momentos en que se marcan goles en hockey se modelan como un Poisson proceso en Morrison (1976). Para tal proceso, suponga que el tiempo promedio entre goles es de 15 minutos.

  1. En un juego de 60 minutos, encuentre la probabilidad de que ocurra un cuarto gol en los últimos 5 minutos del juego.

Funcion para buscar las probabilidades de un evento dado tiempo promedio

pgammatiempo <- function(tiempo_total,minutos, lambda,valor_esperado){
  tiempo_final <- tiempo_total-minutos
  
  return(pgamma(tiempo_total,valor_esperado,lambda)-pgamma(tiempo_final,valor_esperado,lambda))
}

print(pgammatiempo(60,5,1/15,4))
[1] 0.06766216
  1. Suponga que se marcan al menos tres goles en un partido. ¿cual es el tiempo medio del tercer gol?

\[pendiente\]

Comenzando en el tiempo t = 0, los clientes llegan a un restaurante de acuerdo con un Proceso Poisson con tasa 20 clientes por hora. (i) Halle la probabilidad de que el cliente número 60 llegue en el intervalo [2.9, 3].

El tiempo de la llegada número 60 S60 tiene una distribución gamma con parámetros n = 60 y lambda= 20. La probabilidad deseada es P(2.9 < S60 < 3). En R, escriba

pgamma(3,60,20)-pgamma(2.9,60,20)
[1] 0.1034368
  1. Si 60 personas llegan al restaurante en el tiempo t = 3, encuentre la probabilidad de que el El cliente número 60 llega en el intervalo [2.9, 3].

R: Simulating a Poisson Process on [0, t] Following is a simulation of the arrival times of a Poisson process with parameter lambda = 1∕2 on [0, 30]. ##### poissonsim.R

t <- 30
lambda <- 1/2
N <- rpois(1,lambda*t)
unifs <- runif(N,0,t)
arrivals <- sort(unifs)
arrivals
 [1]  4.065182  4.126208  4.463394  5.482307 10.708033 11.883217 18.565620 18.579892 18.591917 24.639521 24.760236
[12] 24.950450 25.528127 26.003426
plot(arrivals, pch=20, cex=2)

Un proceso de Poisson espacial en el plano tiene el parámetro lambda = 1∕2. Encuentre la probabilidad de que un disco de radio 2 con centro en (3, 4) contenga exactamente 5 puntos.

Sea C el disco. Entonces |C| = pi * r 2 = 4 pi. La probabilidad deseada es

dpois(5,2*3.14159)
[1] 0.1523933
lambda <- 100
squarearea <- 1
trials <- 100000
simlist <- numeric(trials)
for (i in 1:trials) {

N <- rpois(1,lambda*squarearea)
xpoints <- runif(N,0,1)
ypoints <- runif(N,0,1)
ct <- sum(((xpoints-0.7) ^ 2+(ypoints-0.7) ^ 2)<=0.2 ^ 2)
simlist[i] <- ct } # number of points in circle
mean(simlist)
[1] 12.54264
var(simlist)
[1] 12.55191
# Compare with theoretical mean and variance
lambda*pi*(0.2) ^ 2

# waitingparadox.R
mytime <- 50
lambda <- 1/10
trials <- 10000
simlist <- numeric(trials)
  for (i in 1:trials) {
    N <- rpois(1,300*lambda)
    arrivals <- sort(runif(N,0,300))
    wait <- arrivals[arrivals > mytime][1] - mytime

simlist[i] <- wait }
mean(simlist)
[1] 10.10489

6.2 ) Let (Nt)t?0 be a Poisson process with parameter = 1.5. Find the following: (a) P(N1 =2,N4 =6) (b) P(N4 = 6|N1 = 2) (c) P(N1 = 2|N4 = 6)




6.3) Las llamadas se reciben en un centro de llamadas de la empresa de acuerdo con un proceso de Poisson en la tasa de cinco llamadas por minuto.

  1. Encuentre la probabilidad de que no ocurra ninguna llamada durante un período de 30 segundos.

dpois : devuelve el valor de la función de densidad de probabilidad de Poisson. ppois : devuelve el valor de la función de densidad acumulativa de Poisson. qpois : devuelve el valor de la función de densidad acumulativa de Poisson inversa. rpois : genera un vector de variables aleatorias distribuidas de Poisson.

#0 llamadas , 30 segundos => 5 llamadas promedio * 1/2 
dpois(0,5*1/2)
  1. Encuentre la probabilidad de que ocurran exactamente cuatro llamadas en el primer minuto y seis las llamadas ocurren en el segundo minuto.
dpois(4,5) * dpois(6,5) 
  1. Encuentre la probabilidad de que se reciban 25 llamadas en los primeros 5 minutos y seis de esas llamadas ocurren en el primer minuto.
dpois(6,5) * dpois(19,5*4) 

6.4) A partir de las 9 a. m., los pacientes llegan al consultorio de un médico según un proceso de Poisson. En promedio, llegan tres pacientes cada hora.

  1. Calcule la probabilidad de que al menos dos pacientes lleguen a las 9:30 a. m.
#lambda = 3/2 = 1.5
resultado <- 1 - ppois(1,1.5)
resultado
  1. Halle la probabilidad de que 10 pacientes lleguen al mediodía y ocho de ellos lleguen al consultorio antes de las 11 a. m.
#lambda para dos horas -> 6
#lambda para una hora -> 3

dpois(8,6) * dpois(2,3) 
  1. Si llegan seis pacientes a las 10 a. m., encuentre la probabilidad de que solo llegue un paciente a las 9:15 a. m.
#lambda para dos horas -> 6
#lambda para una hora -> 3

dpois(8,6) * dpois(2,3) 

6.5)

LS0tDQp0aXRsZTogIkVqZXJjaWNpb3MgU2VndW5kbyBQYXJjaWFsIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQplZGl0b3Jfb3B0aW9uczogDQogIG1hcmtkb3duOiANCiAgICB3cmFwOiA3Mg0KLS0tDQoNCiMjIyBEZWZpbmljaW9uDQoNCiMjIyBFamVtcGxvcw0KDQpTdGFydGluZyBhdCA2IGEubS4sIGN1c3RvbWVycyBhcnJpdmUgYXQgTWFydGhhJ3MgYmFrZXJ5IGFjY29yZGluZyB0byBhDQpQb2lzc29uIHByb2Nlc3MgYXQgdGhlIHJhdGUgb2YgMzAgY3VzdG9tZXJzIHBlciBob3VyLiBGaW5kIHRoZQ0KcHJvYmFiaWxpdHkgdGhhdCBtb3JlIHRoYW4gNjUgY3VzdG9tZXJzIGFycml2ZSBiZXR3ZWVuIDkgYW5kIDExIGEubS4NCg0KYGBge3J9DQoxLXBwb2lzKDY1LDIqMzApDQpgYGANCg0KSm9lIHJlY2VpdmVzIHRleHQgbWVzc2FnZXMgc3RhcnRpbmcgYXQgMTAgYS5tLiBhdCB0aGUgcmF0ZSBvZiAxMCB0ZXh0cw0KcGVyIGhvdXIgYWNjb3JkaW5nIHRvIGEgUG9pc3NvbiBwcm9jZXNzLiBGaW5kIHRoZSBwcm9iYWJpbGl0eSB0aGF0IGhlDQp3aWxsIHJlY2VpdmUgZXhhY3RseSAxOCB0ZXh0cyBieSBub29uIGFuZCA3MCB0ZXh0cyBieSA1IHAubS4NCg0KVGhlIGRlc2lyZWQgcHJvYmFiaWxpdHkgaXMgUChOMiA9IDE4LCBONyA9IDcwKSwgd2l0aCB0aW1lIGFzIGhvdXJzLiBJZg0KMTggdGV4dHMgYXJyaXZlIGluIFswLCAyXSBhbmQgNzAgdGV4dHMgYXJyaXZlIGluIFswLCA3XSwgdGhlbiB0aGVyZSBhcmUNCjcwIOKIkiAxOCA9IDUyIHRleHRzIGluICgyLCA3XS4gVGhhdCBpcywge04yID0gMTgsIE43ID0gNzB9ID0ge04yID0gMTgsIE43DQriiJIgTjIgPSA1Mn0uDQoNClRoZSBpbnRlcnZhbHMgWzAsIDJdIGFuZCAoMiwgN10gYXJlIGRpc2pvaW50LCB3aGljaCBnaXZlcyBQKE4yID0gMTgsIE43DQo9IDcwKSA9IFAoTjIgPSAxOCwgTjcg4oiSIE4yID0gNTIpID0gUChOMiA9IDE4KSBQKE43IOKIkiBOMiA9IDUyKSA9IFAoTjIgPQ0KMTgpIFAoTjUgPSA1MikNCg0KPSAoZeKIkjIoMTApKDIoMTApKVwqXCogMTgvMTghKSBcKiAoZeKIkjUoMTApKDUoMTApKVwqXCogNTIvNTIhKQ0KDQp3aGVyZSB0aGUgc2Vjb25kIGVxdWFsaXR5IGlzIGJlY2F1c2Ugb2YgaW5kZXBlbmRlbnQgaW5jcmVtZW50cywgYW5kIHRoZQ0KdGhpcmQgZXF1YWwtIGl0eSBpcyBiZWNhdXNlIG9mIHN0YXRpb25hcnkgaW5jcmVtZW50cy4gVGhlIGluYWwNCmNhbGN1bGF0aW9uIGluIFIgaXMNCg0KKipiYXNlIGVsIGVsIHByb21lZGlvIHBvciBob3JhLCB4LHkgZXMgbGEgbXVsdGlwbGljYWNpb24gZGUgZWwgcHJpbWVyDQpldmVudG8gcG9yIGxhIGNhbnRpZGFkIGRlIHRpZW1wbyB0cmFuc2N1cnJpZGEgc2llbmRvIG0sbiBsbyBtaXNtbyBwZXJvDQpwYXJhIGVsIHNpZ3VpZW50ZSBldmVudG8qKg0KDQpgYGB7cn0NCnBvaXNzb25fbXVsdGlwbGljYWRvIDwtIGZ1bmN0aW9uKHgseSxtLG4sYmFzZSl7DQogIHJlc3VsdGFkbyA8LSAwDQogICAgcmVzdWx0YWRvIDwtIGRwb2lzKHgseSpiYXNlKSpkcG9pcyhtLG4qYmFzZSkNCiAgICByZXR1cm4ocmVzdWx0YWRvKQ0KfQ0KDQpyZXN1bHRhZG8wIDwtIHBvaXNzb25fbXVsdGlwbGljYWRvKDE4LDIsNTIsNSwxMCkNCnByaW50KHJlc3VsdGFkbzApDQoNCmBgYA0KIyMjIyMgUHJvY2VzbyBkZSBQb2lzc29uIHRyYWR1Y2lkbw0KDQpPbiBlbGVjdGlvbiBkYXksIHBlb3BsZSBhcnJpdmUgYXQgYSB2b3RpbmcgY2VudGVyIGFjY29yZGluZyB0byBhIFBvaXMtDQpzb24gcHJvY2Vzcy4gT24gYXZlcmFnZSwgMTAwIHZvdGVycyBhcnJpdmUgZXZlcnkgaG91ci4gSWYgMTUwIHBlb3BsZQ0KYXJyaXZlIGR1cmluZyB0aGUgaXJzdCBob3VyLCB3aGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IGF0IG1vc3QgMzUwDQpwZW9wbGUgYXJyaXZlIGJlZm9yZSB0aGUgdGhpcmQgaG91cj8NCg0KTGV0IE50IGRlbm90ZSB0aGUgbnVtYmVyIG9mIGFycml2YWxzIGluIHRoZSBpcnN0IHQgaG91cnMuIFRoZW4sIChOdCl04omlMA0KaXMgYSBQb2lzc29uIHByb2Nlc3Mgd2l0aCBwYXJhbWV0ZXIgbGFtYmRhID0gMTAwLiBHaXZlbiBOMSA9IDE1MCwgdGhlDQpkaXN0cmlidXRpb24gb2YgTjMg4oiSIE4xID0gTjMg4oiSIDE1MCBpcyBlcXVhbCB0byB0aGUgZGlzdHJpYnV0aW9uIG9mIE4yLg0KVGhpcyBnaXZlcw0KDQpQKE4zIOKJpCAzNTBcfE4xID0gMTUwKSA9IFAoTjMg4oiSIDE1MCDiiaQgMjAwXHxOMSA9IDE1MCkgPSBQKE4yIOKJpCAyMDApDQoNCioqRXN0YSBmb3JtdWxhIHNlIHV0bGl6YSBjdWFuZG8gb2N1cnJlIHVuIHJlc3VsdGFkbyBkaWZlcmVudGUgZGUgbGENCm1lZGlhIHkgc2UgZXNwZXJhIHVuIHJlc3VsdGFkbyBwb3N0ZXJpb3IgZW4gZWwgdGllbXBvIGRhZG8geD1wcm9tZWRpbyAsDQp5PW51bWVyb19kZV9ldmVudG9zLCB6PWVzcGVyYWRvX2FjY2lvbmVzKioNCg0KYGBge3J9DQpwb2lzc29uX2FjdW11bGFkYSA8LSBmdW5jdGlvbiAoeCx5LHopew0KICAgIHJlc3VsdGFkbyA8LSAwDQogICAgZm9yKGkgaW4gMDp6KXsNCiAgICAgIHJlc3VsdGFkbyA9IHJlc3VsdGFkbyArIGRwb2lzKGkseCp5KQ0KICAgIH0NCiAgICByZXR1cm4ocmVzdWx0YWRvKQ0KfQ0KDQpyZXN1bHRhZG8gPC0gcG9pc3Nvbl9hY3VtdWxhZGEoMTAwLDIsMjAwKQ0KcHJpbnQocmVzdWx0YWRvKQ0KYGBgDQoNCiMjIyMgQVJSSVZBTCwgSU5URVJBUlJJVkFMIFRJTUVTDQoNCkJ1cyBXYWl0aW5nIFRpbWVzDQoNCmBgYHtyfQ0KIyBidXN3YWl0aW5nLlINCnRyaWFscyA8LSA1MDAwDQphbXkgPC0gbnVtZXJpYyh0cmlhbHMpDQp6YWNoIDwtIG51bWVyaWModHJpYWxzKQ0KZm9yIChpIGluIDE6dHJpYWxzKSB7DQogIGJ1cyA8LSByZXhwKDEsMS8zMCkNCiAgYW15W2ldIDwtIGJ1cw0KICB3aGlsZSAoYnVzIDwgMTApIHsgYnVzIDwtIGJ1cyArIHJleHAoMSwxLzMwKSB9DQogIHphY2hbaV0gPC0gYnVzLTEwIH0NCmBgYA0KDQpgYGB7cn0NCm1lYW4oYW15KQ0KDQptZWFuKHphY2gpDQoNCmhpc3QoYW15LHhsYWI9IkFteSIscHJvYj1ULHlsYWI9IiIsbWFpbj0iIikNCmhpc3QoemFjaCx4bGFiPSJaYWNoIixwcm9iPVQseWxhYj0iIixtYWluPSIiKQ0KYGBgDQoNClVuYSBlc3RhY2nDs24gZGUgbWV0cm8gZGUgQm9zdG9uIGRhIHNlcnZpY2lvIGEgbGFzIGzDrW5lYXMgcm9qYSwgdmVyZGUgeSBuYXJhbmphLg0KTG9zIHN1YnRlcnLDoW5lb3MgZGUgY2FkYSBsw61uZWEgbGxlZ2FuIGEgbGEgZXN0YWNpw7NuIGRlIGFjdWVyZG8gY29uIHRyZXMgUG9pc3NvbiBpbmRlcGVuZGllbnRlcy4NCnByb2Nlc29zLiBFbiBwcm9tZWRpbywgaGF5IHVuIHRyZW4gcm9qbyBjYWRhIDEwIG1pbnV0b3MsIHVuIHRyZW4gdmVyZGUgY2FkYQ0KMTUgbWludXRvcyB5IHVuIHRyZW4gbmFyYW5qYSBjYWRhIDIwIG1pbnV0b3MuDQoNCmkpIEN1YW5kbyBsbGVndWUgYSBsYSBlc3RhY2nDs24sIMK/Y3XDoWwgZXMgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBlbCBwcmltZXIgbWV0cm8gcXVlIGxsZWdhIGVzIHBvciBsYSBsaW5lYSB2ZXJkZT8NCmlpKcK/Q3XDoW50byB0aWVtcG8gZXNwZXJhcsOhLCBlbiBwcm9tZWRpbywgYW50ZXMgZGUgcXVlIGxsZWd1ZSBhbGfDum4gdHJlbj8NCmlpaSlIYSBlc3RhZG8gZXNwZXJhbmRvIDIwIG1pbnV0b3MgcG9yIHVuIHRyZW4gcm9qbyB5IGhhIHZpc3RvIHRyZXMNCnBhc2FuIGxvcyB0cmVuZXMgbmFyYW5qYXMuIMK/Q3XDoWwgZXMgZWwgdGllbXBvIGFkaWNpb25hbCBlc3BlcmFkbyBxdWUgZXNwZXJhcsOhDQp0dSBtZXRybz8NCg0KaSkNClNlYW4gWEcsIFhSIHkgWE8sIHJlc3BlY3RpdmFtZW50ZSwgbG9zIHRpZW1wb3MgZGUgbGFzIHByaW1lcmFzIGx1Y2VzIHZlcmRlLCByb2phIHkgcm9qYS4NCnN1YnRlcnLDoW5lb3MgbmFyYW5qYXMgcXVlIGxsZWdhbiBhIGxhIGVzdGFjacOzbi4gRWwgZXZlbnRvIGRlIHF1ZSBlbCBwcmltZXIgc3VidGVycsOhbmVvIGVzDQp2ZXJkZSBlcyBlbCBldmVudG8gZGUgcXVlIFhHIGVzIGVsIG3DrW5pbW8gZGUgbG9zIHRyZXMgYWxlYXRvcmlvcyBpbmRlcGVuZGllbnRlcw0KdmFyaWFibGVzIExhIHByb2JhYmlsaWRhZCBkZXNlYWRhIGVzOg0KDQpQKG1pbihYRywgWFIsIFhPKSA9IFhHKSA9ICgx4oiVMTUpIC8gKDHiiJUxMCArIDHiiJUxNSArIDHiiJUyMCkgPSA0LzEzID0gMC4zMS4NCg0KYGBge3J9DQpkYXRvcyA8LSBjKDEwLDE1LDIwKQ0KZXNwZXJhZG8gPC0gMTUNCnByb21lZGlvIDwtIDANCmxsZWdhZGFzX2VzcGVyYWRhcyA8LSBmdW5jdGlvbihkYXRvcyxlc3BlcmFkbyl7DQogIGZvciggeCBpbiBkYXRvcyl7DQogICAgICBwcm9tZWRpbyA8LSAgcHJvbWVkaW8gKyAoMS94KSANCiAgfQ0KICANCiAgcmVzdWx0YWRvIDwtICgxL2VzcGVyYWRvKS9wcm9tZWRpbw0KICByZXR1cm4ocmVzdWx0YWRvKQ0KfQ0KDQpyZXN1bHRhZG8gPC0gbGxlZ2FkYXNfZXNwZXJhZGFzKGRhdG9zLGVzcGVyYWRvKQ0KcHJpbnQocmVzdWx0YWRvKQ0KYGBgDQoNCmBgYHtyfQ0KcHJvbWVkaW9fbGxlZ2FkYXMgPC0gZnVuY3Rpb24oZGF0b3Mpew0KICBwcm9tZWRpbyA8LSAwIA0KICBmb3IoIHggaW4gZGF0b3Mpew0KICAgICAgcHJvbWVkaW8gPC0gIHByb21lZGlvICsgKDEveCkgDQogICAgICBwcmludCgoMS94KSkNCiAgfQ0KICByZXR1cm4ocHJvbWVkaW8pDQp9DQoNCnByaW50KHByb21lZGlvX2xsZWdhZGFzKGRhdG9zKSkNCg0KdGllbXBvX3Byb21lZGlvIDwtIGZ1bmN0aW9uKCl7DQogIHNpbSA8LSByZXBsaWNhdGUoMTAwMDAsbWluKHJleHAoMSwxLzEwKSxyZXhwKDEsMS8xNSkscmV4cCgxLDEvMjApKSkNCiAgbWVhbihzaW0pDQp9DQoNCmBgYA0KYGBge3J9DQp0aWVtcG9fcHJvbWVkaW8gPC0gZnVuY3Rpb24oZGF0b3Mpew0KICBzaW0gPC0gcmVwbGljYXRlKDEwMDAwLG1pbihyZXhwKDEsMS8xMCkscmV4cCgxLDEvMTUpLHJleHAoMSwxLzIwKSkpDQogIG8gPC0gbWVhbihzaW0pDQogIHJldHVybihvKQ0KfQ0KDQpzZWd1bmRvIDwtIHRpZW1wb19wcm9tZWRpbyhkYXRvcykNCnByaW50KHNlZ3VuZG8pDQpgYGANClN1IHRpZW1wbyBkZSBlc3BlcmEgZXMgaW5kZXBlbmRpZW50ZSBkZSBsYXMgbGxlZ2FkYXMgbmFyYW5qYXMuIHBvciBmYWx0YSBkZSBtZW1vcmlhIGRlIHRpZW1wb3MgZW50cmUgbGxlZ2FkYXMsIGVsIHRpZW1wbyBkZSBlc3BlcmEgYWRpY2lvbmFsIHBhcmEgbGEgbMOtbmVhIHJvamEgdGllbmUgZWwgbWlzbW8gZGlzdHJpYnVjacOzbiBjb21vIGVsIHRpZW1wbyBkZSBlc3BlcmEgb3JpZ2luYWwuIEVzcGVyYXLDoXMsIGVuIHByb21lZGlvLCAxMCBtw6FzIG1pbnV0b3MuDQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KTG9zIG1vbWVudG9zIGVuIHF1ZSBzZSBtYXJjYW4gZ29sZXMgZW4gaG9ja2V5IHNlIG1vZGVsYW4gY29tbyB1biBQb2lzc29uDQpwcm9jZXNvIGVuIE1vcnJpc29uICgxOTc2KS4gUGFyYSB0YWwgcHJvY2Vzbywgc3Vwb25nYSBxdWUgZWwgdGllbXBvIHByb21lZGlvIGVudHJlDQpnb2xlcyBlcyBkZSAxNSBtaW51dG9zLg0KDQooaSkgRW4gdW4ganVlZ28gZGUgNjAgbWludXRvcywgZW5jdWVudHJlIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgb2N1cnJhIHVuIGN1YXJ0byBnb2wgZW4gbG9zIMO6bHRpbW9zIDUNCm1pbnV0b3MgZGVsIGp1ZWdvLg0KDQo8Y2VudGVyPg0KPGltZyBzcmM9Ii4vaW1hZ2VuZXMvdW5vLmpwZyIgc3R5bGU9IndpZHRoOjUwMHB4Ii8+DQo8L2NlbnRlcj4NCg0KKipGdW5jaW9uIHBhcmEgYnVzY2FyIGxhcyBwcm9iYWJpbGlkYWRlcyBkZSB1biBldmVudG8gZGFkbyB0aWVtcG8gcHJvbWVkaW8qKg0KYGBge3J9DQpwZ2FtbWF0aWVtcG8gPC0gZnVuY3Rpb24odGllbXBvX3RvdGFsLG1pbnV0b3MsIGxhbWJkYSx2YWxvcl9lc3BlcmFkbyl7DQogIHRpZW1wb19maW5hbCA8LSB0aWVtcG9fdG90YWwtbWludXRvcw0KICANCiAgcmV0dXJuKHBnYW1tYSh0aWVtcG9fdG90YWwsdmFsb3JfZXNwZXJhZG8sbGFtYmRhKS1wZ2FtbWEodGllbXBvX2ZpbmFsLHZhbG9yX2VzcGVyYWRvLGxhbWJkYSkpDQp9DQoNCnByaW50KHBnYW1tYXRpZW1wbyg2MCw1LDEvMTUsNCkpDQpgYGANCg0KDQooaWkpIFN1cG9uZ2EgcXVlIHNlIG1hcmNhbiBhbCBtZW5vcyB0cmVzIGdvbGVzIGVuIHVuIHBhcnRpZG8uIMK/Y3VhbCBlcyBlbCB0aWVtcG8gbWVkaW8NCmRlbCB0ZXJjZXIgZ29sPw0KDQo8Y2VudGVyPg0KPGltZyBzcmM9Ii4vaW1hZ2VuZXMvZG9zLmpwZyIgc3R5bGU9IndpZHRoOjUwMHB4Ii8+DQo8L2NlbnRlcj4NCg0KJCRwZW5kaWVudGUkJA0KDQpDb21lbnphbmRvIGVuIGVsIHRpZW1wbyB0ID0gMCwgbG9zIGNsaWVudGVzIGxsZWdhbiBhIHVuIHJlc3RhdXJhbnRlIGRlIGFjdWVyZG8gY29uIHVuDQpQcm9jZXNvIFBvaXNzb24gY29uIHRhc2EgMjAgY2xpZW50ZXMgcG9yIGhvcmEuDQooaSkgSGFsbGUgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBlbCBjbGllbnRlIG7Dum1lcm8gNjAgbGxlZ3VlIGVuIGVsIGludGVydmFsbyBbMi45LCAzXS4NCg0KDQoNCkVsIHRpZW1wbyBkZSBsYSBsbGVnYWRhIG7Dum1lcm8gNjAgUzYwIHRpZW5lIHVuYSBkaXN0cmlidWNpw7NuIGdhbW1hIGNvbiBwYXLDoW1ldHJvcw0KbiA9IDYwIHkgIGxhbWJkYT0gMjAuIExhIHByb2JhYmlsaWRhZCBkZXNlYWRhIGVzIFAoMi45IDwgUzYwIDwgMykuIEVuIFIsIGVzY3JpYmENCmBgYHtyfQ0KcGdhbW1hKDMsNjAsMjApLXBnYW1tYSgyLjksNjAsMjApDQpgYGANCg0KDQooaWkpIFNpIDYwIHBlcnNvbmFzIGxsZWdhbiBhbCByZXN0YXVyYW50ZSBlbiBlbCB0aWVtcG8gdCA9IDMsIGVuY3VlbnRyZSBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGVsDQpFbCBjbGllbnRlIG7Dum1lcm8gNjAgbGxlZ2EgZW4gZWwgaW50ZXJ2YWxvIFsyLjksIDNdLg0KDQoNClI6IFNpbXVsYXRpbmcgYSBQb2lzc29uIFByb2Nlc3Mgb24gWzAsIHRdDQpGb2xsb3dpbmcgaXMgYSBzaW11bGF0aW9uIG9mIHRoZSBhcnJpdmFsIHRpbWVzIG9mIGEgUG9pc3NvbiBwcm9jZXNzIHdpdGggcGFyYW1ldGVyDQpsYW1iZGEgPSAx4oiVMiBvbiBbMCwgMzBdLg0KIyMjIyMgcG9pc3NvbnNpbS5SDQpgYGB7cn0NCnQgPC0gMzANCmxhbWJkYSA8LSAxLzINCk4gPC0gcnBvaXMoMSxsYW1iZGEqdCkNCnVuaWZzIDwtIHJ1bmlmKE4sMCx0KQ0KYXJyaXZhbHMgPC0gc29ydCh1bmlmcykNCmFycml2YWxzDQpgYGANCmBgYHtyfQ0KcGxvdChhcnJpdmFscywgcGNoPTIwLCBjZXg9MikNCmBgYA0KDQpVbiBwcm9jZXNvIGRlIFBvaXNzb24gZXNwYWNpYWwgZW4gZWwgcGxhbm8gdGllbmUgZWwgcGFyw6FtZXRybyBsYW1iZGEgPSAx4oiVMi4NCkVuY3VlbnRyZSBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHVuIGRpc2NvIGRlIHJhZGlvIDIgY29uIGNlbnRybyBlbiAoMywgNCkgY29udGVuZ2EgZXhhY3RhbWVudGUgNSBwdW50b3MuDQoNCg0KU2VhIEMgZWwgZGlzY28uIEVudG9uY2VzIHxDfCA9IHBpICogciAqKjIgPSA0ICoqIHBpLiBMYSBwcm9iYWJpbGlkYWQgZGVzZWFkYSBlcw0KDQpgYGB7cn0NCmRwb2lzKDUsMiozLjE0MTU5KQ0KYGBgDQpgYGB7cn0NCmxhbWJkYSA8LSAxMDANCnNxdWFyZWFyZWEgPC0gMQ0KdHJpYWxzIDwtIDEwMDAwMA0Kc2ltbGlzdCA8LSBudW1lcmljKHRyaWFscykNCmZvciAoaSBpbiAxOnRyaWFscykgew0KDQpOIDwtIHJwb2lzKDEsbGFtYmRhKnNxdWFyZWFyZWEpDQp4cG9pbnRzIDwtIHJ1bmlmKE4sMCwxKQ0KeXBvaW50cyA8LSBydW5pZihOLDAsMSkNCmN0IDwtIHN1bSgoKHhwb2ludHMtMC43KSBeIDIrKHlwb2ludHMtMC43KSBeIDIpPD0wLjIgXiAyKQ0Kc2ltbGlzdFtpXSA8LSBjdCB9ICMgbnVtYmVyIG9mIHBvaW50cyBpbiBjaXJjbGUNCm1lYW4oc2ltbGlzdCkNCmBgYA0KYGBge3J9DQp2YXIoc2ltbGlzdCkNCmBgYA0KYGBge3J9DQojIENvbXBhcmUgd2l0aCB0aGVvcmV0aWNhbCBtZWFuIGFuZCB2YXJpYW5jZQ0KbGFtYmRhKnBpKigwLjIpIF4gMg0KYGBgDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQoNCmBgYHtyfQ0KIyB3YWl0aW5ncGFyYWRveC5SDQpteXRpbWUgPC0gNTANCmxhbWJkYSA8LSAxLzEwDQp0cmlhbHMgPC0gMTAwMDANCnNpbWxpc3QgPC0gbnVtZXJpYyh0cmlhbHMpDQogIGZvciAoaSBpbiAxOnRyaWFscykgew0KICAgIE4gPC0gcnBvaXMoMSwzMDAqbGFtYmRhKQ0KICAgIGFycml2YWxzIDwtIHNvcnQocnVuaWYoTiwwLDMwMCkpDQogICAgd2FpdCA8LSBhcnJpdmFsc1thcnJpdmFscyA+IG15dGltZV1bMV0gLSBteXRpbWUNCg0Kc2ltbGlzdFtpXSA8LSB3YWl0IH0NCm1lYW4oc2ltbGlzdCkNCmBgYA0KNi4yICkgTGV0IChOdCl0PzAgYmUgYSBQb2lzc29uIHByb2Nlc3Mgd2l0aCBwYXJhbWV0ZXIgPSAxLjUuIEZpbmQgdGhlIGZvbGxvd2luZzogKGEpIFAoTjEgPTIsTjQgPTYpIChiKSBQKE40ID0gNnxOMSA9IDIpIChjKSBQKE4xID0gMnxONCA9IDYpDQoNCg0KPGNlbnRlcj4NCjxpbWcgc3JjPSIuL2ltYWdlbmVzL3RyZXMucG5nIiBzdHlsZT0id2lkdGg6NTAwcHgiLz4NCjwvY2VudGVyPg0KDQo8YnI+DQoNCjxjZW50ZXI+DQo8aW1nIHNyYz0iLi9pbWFnZW5lcy9wdW50b19jdWF0cm8ucG5nIiBzdHlsZT0id2lkdGg6NTAwcHgiLz4NCjwvY2VudGVyPg0KDQo8YnI+DQoNCjxjZW50ZXI+DQo8aW1nIHNyYz0iLi9pbWFnZW5lcy9jdWF0cm8ucG5nIiBzdHlsZT0id2lkdGg6NTAwcHgiLz4NCjwvY2VudGVyPg0KDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCjYuMykgTGFzIGxsYW1hZGFzIHNlIHJlY2liZW4gZW4gdW4gY2VudHJvIGRlIGxsYW1hZGFzIGRlIGxhIGVtcHJlc2EgZGUgYWN1ZXJkbyBjb24gdW4gcHJvY2VzbyBkZSBQb2lzc29uIGVuIGxhIHRhc2EgZGUgY2luY28gbGxhbWFkYXMgcG9yIG1pbnV0by4NCg0KDQooYSkgRW5jdWVudHJlIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgbm8gb2N1cnJhIG5pbmd1bmEgbGxhbWFkYSBkdXJhbnRlIHVuIHBlcsOtb2RvIGRlIDMwIHNlZ3VuZG9zLg0KDQpkcG9pcyA6IGRldnVlbHZlIGVsIHZhbG9yIGRlIGxhIGZ1bmNpw7NuIGRlIGRlbnNpZGFkIGRlIHByb2JhYmlsaWRhZCBkZSBQb2lzc29uLg0KcHBvaXMgOiBkZXZ1ZWx2ZSBlbCB2YWxvciBkZSBsYSBmdW5jacOzbiBkZSBkZW5zaWRhZCBhY3VtdWxhdGl2YSBkZSBQb2lzc29uLg0KcXBvaXMgOiBkZXZ1ZWx2ZSBlbCB2YWxvciBkZSBsYSBmdW5jacOzbiBkZSBkZW5zaWRhZCBhY3VtdWxhdGl2YSBkZSBQb2lzc29uIGludmVyc2EuDQpycG9pcyA6IGdlbmVyYSB1biB2ZWN0b3IgZGUgdmFyaWFibGVzIGFsZWF0b3JpYXMgZGlzdHJpYnVpZGFzIGRlIFBvaXNzb24uDQoNCmBgYHtyfQ0KIzAgbGxhbWFkYXMgLCAzMCBzZWd1bmRvcyA9PiA1IGxsYW1hZGFzIHByb21lZGlvICogMS8yIA0KZHBvaXMoMCw1KjEvMikNCmBgYA0KDQpiKSBFbmN1ZW50cmUgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBvY3VycmFuIGV4YWN0YW1lbnRlIGN1YXRybyBsbGFtYWRhcyBlbiBlbCBwcmltZXIgbWludXRvIHkgc2VpcyBsYXMgbGxhbWFkYXMgb2N1cnJlbiBlbiBlbCBzZWd1bmRvIG1pbnV0by4NCg0KDQoNCmBgYHtyfQ0KZHBvaXMoNCw1KSAqIGRwb2lzKDYsNSkgDQpgYGANCg0KYykgRW5jdWVudHJlIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgc2UgcmVjaWJhbiAyNSBsbGFtYWRhcyBlbiBsb3MgcHJpbWVyb3MgNSBtaW51dG9zIHkgc2Vpcw0KZGUgZXNhcyBsbGFtYWRhcyBvY3VycmVuIGVuIGVsIHByaW1lciBtaW51dG8uDQoNCmBgYHtyfQ0KZHBvaXMoNiw1KSAqIGRwb2lzKDE5LDUqNCkgDQpgYGANCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQo2LjQpIEEgcGFydGlyIGRlIGxhcyA5IGEuIG0uLCBsb3MgcGFjaWVudGVzIGxsZWdhbiBhbCBjb25zdWx0b3JpbyBkZSB1biBtw6lkaWNvIHNlZ8O6biB1biBwcm9jZXNvIGRlIFBvaXNzb24uIEVuIHByb21lZGlvLCBsbGVnYW4gdHJlcyBwYWNpZW50ZXMgY2FkYSBob3JhLg0KDQooYSkgQ2FsY3VsZSBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGFsIG1lbm9zIGRvcyBwYWNpZW50ZXMgbGxlZ3VlbiBhIGxhcyA5OjMwIGEuIG0uDQoNCmBgYHtyfQ0KI2xhbWJkYSA9IDMvMiA9IDEuNQ0KcmVzdWx0YWRvIDwtIDEgLSBwcG9pcygxLDEuNSkNCnJlc3VsdGFkbw0KYGBgDQoNCg0KKGIpIEhhbGxlIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgMTAgcGFjaWVudGVzIGxsZWd1ZW4gYWwgbWVkaW9kw61hIHkgb2NobyBkZSBlbGxvcyBsbGVndWVuIGFsIGNvbnN1bHRvcmlvIGFudGVzIGRlIGxhcyAxMSBhLiBtLg0KDQpgYGB7cn0NCiNsYW1iZGEgcGFyYSBkb3MgaG9yYXMgLT4gNg0KI2xhbWJkYSBwYXJhIHVuYSBob3JhIC0+IDMNCg0KZHBvaXMoOCw2KSAqIGRwb2lzKDIsMykgDQpgYGANCg0KKGMpIFNpIGxsZWdhbiBzZWlzIHBhY2llbnRlcyBhIGxhcyAxMCBhLiBtLiwgZW5jdWVudHJlIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgc29sbyBsbGVndWUgdW4gcGFjaWVudGUgYSBsYXMgOToxNSBhLiBtLg0KDQpgYGB7cn0NCiNsYW1iZGEgcGFyYSBkb3MgaG9yYXMgLT4gNg0KI2xhbWJkYSBwYXJhIHVuYSBob3JhIC0+IDMNCg0KZHBvaXMoOCw2KSAqIGRwb2lzKDIsMykgDQpgYGANCg0KNi41KQ0KDQoNCg0K